/*
	小明是一个程序员，他最近对罗马数字很感兴趣，决定写一个罗马数字的a+b程序。

	罗马数字规则如下（来自维基百科）：

	罗马数字共有7个，即I（1）、V（5）、X（10）、L（50）、C（100）、D（500）和M（1000）。按照下述的规则可以表示任意正整数。需要注意的是罗马数字中没有“0”，与进位制无关。

	重复数次：一个罗马数字重复几次，就表示这个数的几倍。

	右加左减：
		在较大的罗马数字的右边记上较小的罗马数字，表示大数字加小数字。
		在较大的罗马数字的左边记上较小的罗马数字，表示大数字减小数字。
		左减的数字有限制，仅限于I、X、C。比如45不可以写成VL，只能是XLV
		但是，左减时不可跨越一个位数。比如，99不可以用IC（100 - 1）表示，而是用XCIX（[100 - 10] + [10 - 1]）表示。（等同与阿拉伯数字每位数字分别表示。）
		左减数字必须为一位，比如8写成VIII，而非IIX。
		右加数字不可连续超过三位，比如14写成XIV，而非XIIII。
	一些例子如MDCCCLXXX表示1880，CXCIX表示199。点击这里查看更多例子。

	输入包含两行，每行为一个只由上述7个字符组成的字符串，来表示一个不大于1000的罗马数字。

	输出一行，如果输入的不能识别为合法的罗马数字，输出“Aha! I don't need to calculate the sum”。如果合法，则输出两个数字之和，结果用罗马数字来表示。
 */

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#if defined(_WIN32) && !defined(__cplusplus)
#define inline __inline
#endif

#define TRUE 1
#define FALSE 0
typedef int BOOL;	/* Boolean是布尔类型,其值是TRUE或FALSE */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Append(char **str, int *capacity, const char *s)
{
	int len = strlen(s);
	int length = len + strlen(*str);
	if (length >= *capacity)
	{
		*capacity += len;
		*str = (char *)realloc(*str, sizeof(char) * (*capacity));
	}
	strcat(*str, s);
}

char * ConvertNumberToRoman(int k, const char *roman[], short val[])
{
	int capacity = 20;
	int i = 0;
	char *re = (char *)malloc(capacity * sizeof(char));
	re[0] = 0;
	while (k > 0)
	{
		while (k >= val[i])
		{
			Append(&re, &capacity, roman[i]);
			k -= val[i];
		}
		i++;
	}
	return re;
}

BOOL LegalDiff(int left, int right)
{
	int diff = right - left;
	if (diff <= 0) return TRUE;
	return 	(diff == 4 || diff == 5 || diff == 9
		|| diff == 40 || diff == 50 || diff == 90
		|| diff == 400 || diff == 500 || diff == 900); // 左减时不可跨越一个位数。比如，99不可以用IC（100 - 1）表示，而是用XCIX（[100 - 10] + [10 - 1]）表示
}

int ConvertRomanToNumber(const char *str, const short map[])
{
	int result = map[str[0]];
	if (result == 0) return 0;
	int len = strlen(str);
	for (int t = 1; t < len; t++)
	{
		int pre = map[str[t - 1]];
		if (map[str[t]] == 0) return 0;
		if (t + 2 < len && str[t] != 'M' && str[t - 1] == str[t] && str[t] == str[t + 1] && str[t] == str[t + 2]) return 0; // 同一数码最多只能连续出现三次，如40不可表示为XXXX，而要表示为XL。	
		if (pre >= map[str[t]]) result += map[str[t]];
		else // pre < map[str[t]]
		{
			if (t > 1 && map[str[t - 2]] <= pre) return 0; // 左减数字必须为一位，比如8写成VIII，而非IIX。
			if (!LegalDiff(map[str[t - 1]], map[str[t]])) return 0;
			if (pre != 1 && pre != 10 && pre != 100) return 0;	// 左减的数字有限制，仅限于I、X、C。比如45不可以写成VL，只能是XLV
			result = result - 2 * pre + map[str[t]];
		}
	}
	return result;
}

int main()
{
	const char *roman[] = { "M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I" };
	short val[] = { 1000,900,500,400,100,90,50,40,10,9,5,4,1 };
	short map[100] = { 0 };
	map['I'] = 1;
	map['V'] = 5;
	map['X'] = 10;
	map['L'] = 50;
	map['C'] = 100;
	map['D'] = 500;
	map['M'] = 1000;

	char left[20];
	char right[20];
	scanf("%s", left);
	scanf("%s", right);

	int leftNum = ConvertRomanToNumber(left, map);
	if (leftNum == 0)
	{
		printf("Aha! I don't need to calculate the sum\n");
		goto end;
	}
	int rightNum = ConvertRomanToNumber(right, map);
	if (rightNum == 0)
	{
		printf("Aha! I don't need to calculate the sum\n");
		goto end;
	}
	char *p = ConvertNumberToRoman(leftNum + rightNum, roman, val);
	printf("%s\n", p);
	free(p);

	//for (int i = 1; i <= 2000; ++i)
	//{
	//	char *p = ConvertNumberToRoman(i, roman, val);
	//	int num = ConvertRomanToNumber(p, map);
	//	if (num != i)
	//	{
	//		printf("[Error] expected: %d; actual: %d\n", i, num);
	//	}
	//	free(p);
	//}
end:
	return 0;
}
